package com.example.chamberlainserver.Service;

import com.example.chamberlainserver.Entry.Class;
import com.example.chamberlainserver.dto.ClassDTO;
import com.example.chamberlainserver.dto.PageResult;

import java.util.List;

/**
 * 班级服务接口
 */
public interface ClassService {

    /**
     * 查询所有班级
     * @return 班级列表
     */
    List<Class> getAllClasses();

    /**
     * 根据ID查询班级
     * @param id 班级ID
     * @return 班级信息
     */
    Class getClassById(Long id);

    /**
     * 根据班级代码查询班级
     * @param classCode 班级代码
     * @return 班级信息
     */
    Class getClassByCode(String classCode);

    /**
     * 分页查询班级
     * @param page 页码
     * @param size 每页大小
     * @param className 班级名称（可选）
     * @param grade 年级（可选）
     * @param major 专业（可选）
     * @param department 院系（可选）
     * @param status 状态（可选）
     * @return 分页结果
     */
    PageResult<Class> getClassesByPage(int page, int size, String className, String grade, 
                                      String major, String department, Integer status);

    /**
     * 创建班级
     * @param classDTO 班级信息
     * @return 创建的班级
     */
    Class createClass(ClassDTO classDTO);

    /**
     * 更新班级信息
     * @param id 班级ID
     * @param classDTO 更新的班级信息
     * @return 更新后的班级
     */
    Class updateClass(Long id, ClassDTO classDTO);

    /**
     * 删除班级
     * @param id 班级ID
     * @return 是否删除成功
     */
    boolean deleteClass(Long id);

    /**
     * 批量删除班级
     * @param ids 班级ID列表
     * @return 删除成功的数量
     */
    int deleteClasses(List<Long> ids);

    /**
     * 根据辅导员ID查询班级
     * @param counselorId 辅导员ID
     * @return 班级列表
     */
    List<Class> getClassesByCounselorId(Long counselorId);

    /**
     * 查询未分配辅导员的班级
     * @return 班级列表
     */
    List<Class> getUnassignedClasses();

    /**
     * 根据年级查询班级
     * @param grade 年级
     * @return 班级列表
     */
    List<Class> getClassesByGrade(String grade);

    /**
     * 根据专业查询班级
     * @param major 专业
     * @return 班级列表
     */
    List<Class> getClassesByMajor(String major);

    /**
     * 根据年级和专业查询班级
     * @param grade 年级
     * @param major 专业
     * @return 班级列表
     */
    List<Class> getClassesByGradeAndMajor(String grade, String major);

    /**
     * 更新班级状态
     * @param id 班级ID
     * @param status 状态
     * @return 是否更新成功
     */
    boolean updateClassStatus(Long id, Integer status);

    /**
     * 验证班级代码是否唯一
     * @param classCode 班级代码
     * @param excludeId 排除的ID（用于更新时验证）
     * @return 是否唯一
     */
    boolean isClassCodeUnique(String classCode, Long excludeId);

    /**
     * 验证班级名称是否唯一
     * @param className 班级名称
     * @param excludeId 排除的ID（用于更新时验证）
     * @return 是否唯一
     */
    boolean isClassNameUnique(String className, Long excludeId);

    /**
     * 获取所有年级列表
     * @return 年级列表
     */
    List<String> getAllGrades();

    /**
     * 获取所有专业列表
     * @return 专业列表
     */
    List<String> getAllMajors();

    /**
     * 获取所有院系列表
     * @return 院系列表
     */
    List<String> getAllDepartments();
}